package com.sojson.project.sys.menu.controller.param.verify;

import java.io.IOException;

import com.sojson.constant.Constant;
import com.sojson.enums.core.EMenuContentType;
import com.sojson.enums.core.EMenuIsFrame;
import com.sojson.project.sys.menu.entity.po.Menu;
import com.sojson.result.Result;
import com.sojson.util.ExpUtil;
import com.sojson.util.StringUtil;
import com.sojson.util.param.ParamUtil;
import com.sojson.util.token.TokenUtil;

/**
 * 颈部菜单表控制器参数验证
 * 
 * @author liu
 * @date 2021-03-16
 */
public class MenuParamVerify {

    /**
     * 单条插入
     * 
     * @param dto
     * @return
     * @throws IOException 
     */
    public static Result<Boolean> save(Menu dto) throws IOException {
        if (StringUtil.isBlank(dto.getParentId()) && ParamUtil.isAdminSuper()) {
            dto.setParentId(Constant.MENU_PARENT_ID);
        }
        String parentId = dto.getParentId();
        if (StringUtil.isBlank(parentId)) {
            return Result.fail("上级菜单不能为空！");
        }
        ParamUtil.verifyMenuIdExist(parentId);
        if (StringUtil.isBlank(dto.getEnvironment())) {
            return Result.fail("菜单环境不能为空！");
        }
        if (StringUtil.isBlank(dto.getName())) {
            return Result.fail("菜单名称不能为空！");
        }
        if (StringUtil.isBlank(dto.getType())) {
            return Result.fail("菜单类型不能为空！");
        }

        return init(dto);
    }

    /**
     * 通过id更新
     * 
     * @param dto
     * @return
     * @throws IOException 
     */
    public static Result<Boolean> updateById(Menu dto) throws IOException {
        String id = dto.getId();
        if (StringUtil.isBlank(id)) {
            return Result.fail("ID不能为空！");
        }
        ParamUtil.verifyMenuIdExist(id);
        String parentId = dto.getParentId();
        if (StringUtil.isNotBlank(parentId)) {
            if (parentId.equals(id)) {
                ExpUtil.throwEx("上级部门不能是自己!");
            }
            if (!ParamUtil.isMenuId(parentId)) {
                dto.setParentId(null);
            }
        }

        return init(dto);
    }

    /**
     * 参数初始化
     * 
     * @param dto
     * @return
     * @throws IOException 
     */
    public static Result<Boolean> init(Menu dto) throws IOException {
        if (dto.getIsFrame() == EMenuIsFrame.NO.getCode()) {
            Integer contentType = dto.getContentType();
            if (contentType != null && contentType != EMenuContentType.URL.getCode()) {
                if (StringUtil.isBlank(dto.getComponent())) {
                    return Result.fail("路由ID不能为空！");
                }
            }
        }
        if (TokenUtil.ALL_PERMISSION.equals(dto.getPerms())) {
            return Result.fail("权限标识不能为所有权限！");
        }

        return Result.success();
    }

    /**
     * 通过id修改状态
     * 
     * @param dto
     * @return
     * @throws IOException 
     */
    public static Result<Boolean> updateStatus(Menu dto) throws IOException {
        String id = dto.getId();
        if (StringUtil.isBlank(id)) {
            return Result.fail("ID不能为空！");
        }
        Integer status = dto.getStatus();
        if (StringUtil.isBlank(status)) {
            return Result.fail("状态不能为空！");
        }
        // 判断是否有查询权限
        ParamUtil.verifyMenuIdExist(dto.getId());

        return Result.success();
    }

}